package cn.ssm.nft.turbo.base.utils;

// 使用Jakarta Validation API（原JSR-303规范）
import jakarta.validation.ConstraintViolation;
import jakarta.validation.Validation;
import jakarta.validation.ValidationException;
import jakarta.validation.Validator;
// 指定Hibernate作为校验实现
import org.hibernate.validator.HibernateValidator;

import java.util.Set;

/**
 * 参数校验工具（基于注解的声明式校验）
 * 典型应用场景：服务入口参数校验、DTO对象校验
 */
public class BeanValidator {

    // 初始化线程安全的校验器实例（Hibernate实现+快速失败模式）
    private static Validator validator = Validation.byProvider(HibernateValidator.class)
            .configure()
            .failFast(true)  // 开启快速失败：发现第一个错误立即返回
            .buildValidatorFactory()
            .getValidator();

    /**
     * 对象参数校验方法（支持校验分组）
     * @param object 待校验对象（需包含校验注解如@NotNull）
     * @param groups 校验分组（实现不同场景下的差异化校验）
     * @throws ValidationException 包含首个校验失败信息的异常
     */
    public static void validateObject(Object object, Class<?>... groups) throws ValidationException {
        // 执行校验并获取违规结果集
        Set<ConstraintViolation<Object>> constraintViolations = validator.validate(object, groups);

        // 存在校验错误时抛出异常（取首个错误信息）
        if (!constraintViolations.isEmpty()) {  // 更直观的空集合判断
            String errorMessage = constraintViolations.iterator().next().getMessage();
            throw new ValidationException(errorMessage);
        }
    }
}